import { observer } from "./observe/index"
export function initState(vm) {
  // 初始各种状态
  let opts = vm.$options
  if (opts.data) {
    initData(vm)
  }
  if (opts.props) {
    initProps()
  }
  if (opts.watch) {
    initWatch()
  }
  if (opts.computed) {
    initComputed()
  }
  if (opts.methods) {
    initMethods()
  }
}
/**
 * vue2对data进行初始化
 */
function initData(vm) {
  // 注意:这里要判断data传递的是对象还是函数,写法不同,传递方式不同
  let data = vm.$options.data
  //   typof 函数=>"function" typeof 对象=>"object",typeof 数组=>"object" typeof null=>"object"
  vm._data=data = typeof data === "function" ? data.call(vm) : data //data()表示得到返回值,注意data中this指向问题,
  // 将data中的数据代理到实例上
  for (let k in data) {
    proxy(vm, "_data",k)
  }
  //   vue核心,响应式,所以进行数据劫持
  observer(data)
}
function initProps() {}
function initComputed() {}
function initWatch() {}
function initMethods() {}
function proxy(vm, source, key) {
  Object.defineProperty(vm, key, {
    get() {
      return vm[source][key]
    },
    set(newValue) {
      vm[source][key] = newValue
    },
  })
}
